package com.tinet.reservas;

import java.io.Serializable;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import com.tinet.reservas.bean.ReservaBean;
import com.tinet.reservas.model.Reserva;
import com.tinet.reservas.model.Sala;
import com.tinet.reservas.model.Usuario;

import excepciones.ExisteReservaException;

/**
 * 
 * Managed bean de reserva. Se encarga de las operaciones que involucren a la
 * reserva de salas
 * 
 * @author tinet
 */
@ManagedBean
@ViewScoped
public class ManBeanReserva implements Serializable {

    /**
     * @param serialVersionUID
     */
    private static final long serialVersionUID = 1L;
    /**
     * @EJB mapea el beans de reserva
     */
    @EJB(mappedName = "reservabean", name = "reservabean")
    private transient ReservaBean bean;
    /**
     * @param reserva
     * 
     */
    private Reserva reserva;
    /**
     * @param usuario
     * 
     */
    private Usuario usuario;
    /**
     * @param sala
     * 
     */
    private Sala sala;
    /**
     * @param mensaje
     *            guarda los mensajes que se envian a las paginas xhml
     */
    private String mensaje;
    /**
     * @ManagedProperty inyeccion de managed bean de usuario
     */
    @ManagedProperty("#{manBean}")
    // Esto sirve para inyectar un managed bean dentro de otro, en este caso
    // inyecte manbean dentro de ReservaBean
    private ManBean beanUser;
    /**
     * @ManagedProperty inyeccion de managed bean de sala
     */
    @ManagedProperty("#{manBeanSala}")
    private ManBeanSala beanSala;

    /**
     * 
     * @method ManBeanReserva constructor de managed bean de reserva
     * 
     */
    public ManBeanReserva() {
        if (reserva == null) {
            this.reserva = new Reserva();
        }
    }

    /**
     * 
     * @method getReserva
     * @return string
     * 
     */
    public Reserva getReserva() {
        return reserva;
    }

    /**
     * 
     * @method getMensaje
     * @param reserva
     *            .
     * 
     */
    public void setReserva(Reserva reserva) {
        this.reserva = reserva;
    }

    /**
     * 
     * @method getUsuario
     * @return Usuario
     * 
     */
    public Usuario getUsuario() {
        return usuario;
    }

    /**
     * 
     * @method getMensaje
     * @param usuario
     *            .
     * 
     */
    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    /**
     * 
     * @method getBeanUser
     * @return beanUser .
     * 
     */
    public ManBean getBeanUser() {
        return beanUser;
    }

    /**
     * 
     * @method getMensaje
     * @param beanUser
     *            .
     * 
     */
    public void setBeanUser(ManBean beanUser) {
        this.beanUser = beanUser;
    }

    /**
     * 
     * @method getBeanSala
     * @return BeanSala
     * 
     */
    public ManBeanSala getBeanSala() {
        return beanSala;
    }

    /**
     * 
     * @method setBeanSala
     * @param beanSala
     *            .
     * 
     */
    public void setBeanSala(ManBeanSala beanSala) {
        this.beanSala = beanSala;
    }

    /**
     * @method crearReserva Crea una nueva reserva pero valida que no exista
     *         ya una en la misma sala el mismo dia y a la misma hora
     * @throws ExisteReservaException
     * @param reserva
     *            recibe datos de reserva de la pagina mostrarSalas
     * @return a la pagina mostrarReservas
     */

    public String crearReserva(Reserva reserva) {
        FacesContext context = FacesContext.getCurrentInstance();
        this.usuario = beanUser.getUsuario();
        this.sala = beanSala.getSala();

        reserva.setUsuarioId(this.usuario.getId());
        reserva.setSalaId(this.sala.getId());

        try {
            bean.agregar(reserva);
        } catch (ExisteReservaException ex) {
            mensaje = ex.MENSAJE;
            context.addMessage(null, new FacesMessage("Mensaje: " + mensaje));
            return "mostrarReservas";
        }
        context.addMessage(null, new FacesMessage("Mensaje: "
                + "Reserva creada con exito"));
        return "mostrarReservas";
    }

    /**
     * 
     * @method mostrarTodos
     * @return lista de todas las reservas .
     * 
     */
    public List<Reserva> mostrarTodos() {
        return bean.mostrarTodo();
    }

    /**
     * 
     * @method eliminarReserva
     * @param reserva
     *            .
     * @return pagina mostrarReservas
     */
    public String eliminarReserva(Reserva reserva) {
        FacesContext context = FacesContext.getCurrentInstance();

        bean.eliminar(reserva);
        context.addMessage(null, new FacesMessage("Mensaje: "
                + "Reserva eliminada con exito"));
        return "mostrarReservas";

    }

    /**
     * 
     * @method mostrarReserva muestra en un pop-up la reserva que se quiere
     *         agregar
     * 
     * 
     */
    public void mostrarReserva() {

        org.primefaces.context.RequestContext.getCurrentInstance().update(
                "formReservar:reservarSala");
        org.primefaces.context.RequestContext.getCurrentInstance().execute(
                "PF('dialogoReservarSala').show()");
    }

    /**
     * 
     * @method Metodo que retorna todas las reservas de un usuario.
     * @param user
     *            se refiere al usuario al cual pertenecen las reservas
     * @return una lista de reservas para un usuario en especifico
     */
    public List<Reserva> mostrarMisReservas(Usuario user) {

        return bean.mostrarReservaDeUsuario(user);
    }

    /**
     * 
     * @method eliminarReservaNormal Elimina la reserva de un usuario normal
     *         el cual solo puede eliminar sus propias reservas.
     * @return a pagina mostrarReservasNormal
     * @param reserva
     *            que se quiere eliminar .
     */
    public String eliminarReservaNormal(Reserva reserva) {
        FacesContext context = FacesContext.getCurrentInstance();
        bean.eliminar(reserva);
        context.addMessage(null, new FacesMessage(
                "Mensaje: Reserva eliminada con exito! "));
        return "mostrarReservasNormal";
    }

}
